// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build ignore 
// +build ignore 

// /mksyscall\u windows wrapps golang.org/x/sys/windows/mkwinsyscall。
package main

import (
	"bytes"
	"os"
	"os/exec"
	"path/filepath"
	"runtime"
)

func main() {
	goTool := filepath.Join(runtime.GOROOT(), "bin", "go")

	listCmd := exec.Command(goTool, "list", "-m")
	listCmd.Env = append(os.Environ(), "GO111MODULE=on")

	var (
		cmdEnv  []string
		modArgs []string
	)
	if out, err := listCmd.Output(); err == nil && string(bytes.TrimSpace(out)) == "std" {
		// 强制模块模式使用与标准库中提供的x/sys 
		// 模块版本相同的mkwinsyscall。
		cmdEnv = append(os.Environ(), "GO111MODULE=on")

		// Force-mod=readonly，而不是默认的-mod=vendor。
		// 
		// mkwinsyscall本身并没有出售到标准库中，而且目前这样做是不可行的：std出售的库包含在“std”元模式中（因为一般情况下，它们*链接到
		// 用户二进制文件，与原始导入路径分开），我们不能在“std”中使用二进制文件meta pattern.
		modArgs = []string{"-mod=readonly"}
	} else {
		// 标准库之外的任何人都不应使用此包装器：其他
		// 模块可以直接在mkwinsyscall工具中提供（如
		// https:
		// 显式设置模块模式和-mod=readonly.
		os.Stderr.WriteString("WARNING: Please switch from using:\n    go run $GOROOT/src/syscall/mksyscall_windows.go\nto using:\n    go run golang.org/x/sys/windows/mkwinsyscall\n")
	}

	args := append([]string{"run"}, modArgs...)
	args = append(args, "golang.org/x/sys/windows/mkwinsyscall")
	args = append(args, os.Args[1:]...)
	cmd := exec.Command(goTool, args...)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	cmd.Env = cmdEnv
	err := cmd.Run()
	if err != nil {
		os.Exit(1)
	}
}
